//! SVG支持模块
//!
//! 提供解析和处理SVG元素的功能

use crate::{Attribute, DomNode, HtmlParserError, NodeType};
use once_cell::sync::Lazy;
use std::borrow::Cow;
use std::collections::HashSet;

/// SVG命名空间URI
pub const SVG_NAMESPACE: &str = "http://www.w3.org/2000/svg";

/// SVG元素名称集合
static SVG_ELEMENTS: Lazy<HashSet<&'static str>> = Lazy::new(|| {
    let mut elements = HashSet::new();
    // 添加SVG核心元素
    elements.insert("svg");
    elements.insert("g");
    elements.insert("path");
    elements.insert("rect");
    elements.insert("circle");
    elements.insert("ellipse");
    elements.insert("line");
    elements.insert("polygon");
    elements.insert("polyline");
    elements.insert("text");
    elements.insert("tspan");
    elements.insert("defs");
    elements.insert("clipPath");
    elements.insert("filter");
    elements.insert("linearGradient");
    elements.insert("radialGradient");
    elements.insert("stop");
    elements.insert("mask");
    elements.insert("pattern");
    elements.insert("use");
    // 添加动画元素
    elements.insert("animate");
    elements.insert("animateMotion");
    elements.insert("animateTransform");
    elements.insert("set");
    // 添加描述性元素
    elements.insert("desc");
    elements.insert("metadata");
    elements.insert("title");
    elements
});

/// SVG属性名称集合
static SVG_ATTRIBUTES: Lazy<HashSet<&'static str>> = Lazy::new(|| {
    let mut attributes = HashSet::new();
    // 添加基本SVG属性
    attributes.insert("x");
    attributes.insert("y");
    attributes.insert("width");
    attributes.insert("height");
    attributes.insert("viewBox");
    attributes.insert("preserveAspectRatio");
    attributes.insert("d"); // path数据
    attributes.insert("fill");
    attributes.insert("stroke");
    attributes.insert("stroke-width");
    attributes.insert("stroke-linecap");
    attributes.insert("stroke-linejoin");
    attributes.insert("transform");
    attributes.insert("opacity");
    attributes.insert("rx");
    attributes.insert("ry");
    attributes.insert("cx");
    attributes.insert("cy");
    attributes.insert("r");
    attributes.insert("points");
    attributes.insert("font-size");
    attributes.insert("font-family");
    attributes.insert("text-anchor");
    attributes.insert("dominant-baseline");
    attributes.insert("clip-path");
    attributes.insert("filter");
    attributes.insert("mask");
    attributes.insert("xlink:href");
    attributes
});

/// 检查是否为SVG元素
pub fn is_svg_element(tag_name: &str) -> bool {
    SVG_ELEMENTS.contains(&tag_name.to_lowercase().as_str())
}

/// 检查是否为SVG属性
pub fn is_svg_attribute(attr_name: &str) -> bool {
    SVG_ATTRIBUTES.contains(&attr_name.to_lowercase().as_str())
}

/// 创建SVG命名空间的元素
pub fn create_svg_element(tag_name: &str) -> DomNode {
    DomNode {
        node_type: NodeType::Element(Cow::Owned(tag_name.to_string())),
        namespace: Some(SVG_NAMESPACE.to_string()),
        attributes: Vec::new(),
        children: Vec::new(),
        parent: None,
    }
}

/// 为SVG元素添加默认属性
pub fn add_default_svg_attributes(node: &mut DomNode) {
    if let NodeType::Element(tag_name) = &node.node_type {
        if tag_name.as_ref() == "svg" && !node.has_attribute("xmlns") {
            node.add_attribute("xmlns", SVG_NAMESPACE);
        }
    }
}

/// 验证SVG元素的合法性
pub fn validate_svg_element(node: &DomNode) -> Result<(), HtmlParserError> {
    if let NodeType::Element(tag_name) = &node.node_type {
        if !is_svg_element(tag_name.as_ref()) {
            return Err(HtmlParserError::InvalidNode(format!(
                "无效的SVG元素: {}",
                tag_name
            )));
        }

        // 检查svg根元素是否包含必需属性
        if tag_name.as_ref() == "svg" {
            if !node.has_attribute("width") && !node.has_attribute("viewBox") {
                return Err(HtmlParserError::InvalidNode(
                    "SVG元素缺少必要的width或viewBox属性".to_string(),
                ));
            }
        }
    }

    Ok(())
}
